package com.dong.thread.juc;

import java.util.concurrent.Exchanger;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.LockSupport;

/**
 * LockSupport 支持实现同步锁的一个类，我们也可以直接拿来用
 * 其实现的功能是：阻塞当前线程，LockSupport park unpark比用锁+wait/notify 的方式更方便，不用还得new把锁，
 * 然后wait写在临界区中了；
 * 且notify要叫醒某个指定的线程很费劲，用LockSupport.unpark()叫醒指定线程方便；
 * unpark可以先于park调用，这样当执行到park时就不会停了；而notify是不能先于wait之前调用的；
 *
 * @author by jiweidong on 2021/11/28.
 */
public class T09_LockSupport {

    public static void main(String[] args) {

        Thread t = new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                System.out.println(i);
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if (i == 5) {
                    LockSupport.park();
                }
            }
        });
        t.start();

        // unpark可以先于park调用，这样当执行到park时就不会停了；而notify是不能先于wait之前调用的；
//        LockSupport.unpark(t);

        try {
            TimeUnit.SECONDS.sleep(8);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // LockSupport.unpark()可以叫醒指定线程
        LockSupport.unpark(t);
        System.out.println("8 seconds end.");
    }

}
